<scriptlet>
<implements type="Automation" id="dispatcher">
	<property name="PluginEvent">
		<get/>
	</property>
	<property name="PluginDescription">
		<get/>
	</property>
	<property name="PluginFileFilters">
		<get/>
	</property>
	<property name="PluginIsAutomatic">
		<get/>
	</property>
	<property name="PluginUnpackedFileExtension">
		<get/>
	</property>
	<method name="UnpackFile"/>
	<method name="PackFile"/>
	<method name="IsFolder"/>
	<method name="UnpackFolder"/>
	<method name="PackFolder"/>
	<method name="ShowSettingsDialog"/>
</implements>

<script language="VBS">

'/////////////////////////////////////////////////////////////////////////////
'    This is a plugin for WinMerge.
'    It will display the text content of MS Excel files.
'    Copyright (C) 2005-2014 Takashi Sawanaka
'
'    This program is free software; you can redistribute it and/or modify
'    it under the terms of the GNU General Public License as published by
'    the Free Software Foundation; either version 2 of the License, or
'    (at your option) any later version.
'
'    This program is distributed in the hope that it will be useful,
'    but WITHOUT ANY WARRANTY; without even the implied warranty of
'    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
'    GNU General Public License for more details.
'
'    You should have received a copy of the GNU General Public License
'    along with this program; if not, write to the Free Software
'    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
'

Option Explicit

Const RegKeyPath = "HKCU\Software\Thingamahoochie\WinMerge\Plugins\CompareMSExcelFiles.sct\"
Dim MsgCannotGetMacros
MsgCannotGetMacros = "Cannot get Macros." & vbCrLf & _
	"   To allow WinMerge to compare macros, use MS Office to alter the settings in the Macro Security for the current application." & vbCrLf & _
	"   The Trust access to Visual Basic Project feature should be turned on to use this feature in WinMerge." & vbCrLf

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
Dim wsh: Set wsh = CreateObject("WScript.Shell")

Function isAccessibleVBAProject(wbk)
	Dim count
	count = -1
	On Error Resume Next
	count = wbk.VBProject.VBComponents.Count
	isAccessibleVBAProject = (count > 0)
End Function

Function regRead(Key, DefaultValue)
	regRead = DefaultValue
	On Error Resume Next
	regRead = wsh.RegRead(Key)
End Function

Function writeObjectProperties(fo, items)
	On Error Resume Next
	Dim o
	For Each o In items
		fo.WriteLine o.Name & ": " & o.Value
	Next
End Function

Function QuoteIfNeeded(str)
	Dim fQuote
	If InStr(str, vbTab) > 0 Then
		fQuote = True
	ElseIf InStr(str, """") > 0 Then
		fQuote = True
	ElseIf InStr(str, vbLf) > 0 Then
		fQuote = True
	End If
	If fQuote Then
		QuoteIfNeeded = """" & Replace(str, """", """""") & """"
	Else
		QuoteIfNeeded = str
	End If
End Function

Function writeCellValues(fo, sht)
	Dim varCells, row, col, ary()
	varCells = sht.UsedRange.Value
	If TypeName(varCells) = "String" Then
		fo.WriteLine QuoteIfNeeded(varCells)
	ElseIf Not IsEmpty(varCells) Then
		ReDim ary(UBound(varCells, 2))
		On Error Resume Next
		For row = 1 To UBound(varCells, 1)
			For col = 1 To UBound(varCells, 2)
				ary(col - 1) = QuoteIfNeeded(CStr(varCells(row, col)))
				If Err.Number <> 0 Then
					ary(col - 1) = "Error" & Err.Number
					Err.Clear
				End If
			Next
			fo.WriteLine Join(ary, vbTab)
		Next
	End If
End Function

Function GetAddr(row, col)
    Dim c
    c = col - 1
    Do
        GetAddr = Chr(65 + (c Mod 26)) & GetAddr
        c = (c \ 26) - 1
    Loop While c >= 0
    GetAddr = GetAddr & row
End Function

Function writeFormulas(fo, sht)
	Dim row, col, rowOffset, colOffset, varCells, formula
	rowOffset = sht.UsedRange.Row
	colOffset = sht.UsedRange.Column
	varCells = sht.UsedRange.Formula
	If TypeName(varCells) = "String" Then
		fo.WriteLine GetAddr(rowOffset - 1, colOffset - 1) & ": " & varCells
	Else
		For row = 1 To UBound(varCells, 1)
			For col = 1 To UBound(varCells, 2)
				formula = varCells(row, col)
				If Left(formula, 1) = "=" Then 
					fo.WriteLine GetAddr(row + rowOffset - 1, col + colOffset - 1) & ": " & formula
				End If
			Next
		Next
	End If
End Function

Function getUsedRangeIncludingShapes(sht)
	Dim shp, rng
	Dim col_max, row_max
	col_max = 0
	row_max = 0
	For Each shp In sht.Shapes
		Set rng = shp.BottomRightCell
		If row_max < rng.Row + rng.Rows.Count - 1 Then row_max = rng.Row + rng.Rows.Count - 1
		If col_max < rng.Column + rng.Columns.Count - 1 Then col_max = rng.Column + rng.Columns.Count - 1
	Next
	Set rng = sht.UsedRange
	If row_max < rng.Row + rng.Rows.Count - 1 Then row_max = rng.Row + rng.Rows.Count - 1
	If col_max < rng.Column + rng.Columns.Count - 1 Then col_max = rng.Column + rng.Columns.Count - 1
	Set getUsedRangeIncludingShapes = sht.Range("A1", sht.Cells(row_max, col_max))
End Function

Sub ungroupShapes(sht)
    On Error Resume Next
    Dim cnt, shp
    Do
        cnt = sht.Shapes.Count
        For Each shp In sht.Shapes
            shp.ungroup
        Next
    Loop While cnt <> sht.Shapes.Count
End Sub

Function writeTextsInShapes(fo, sht)
	Dim shp
	On Error Resume Next
	For Each shp In sht.Shapes
		fo.WriteLine shp.Name & ": " & shp.TextFrame.Characters.Text
	Next
	On Error GoTo 0
End Function

Function writeHeadersAndFooters(fo, sht)
	On Error Resume Next
	fo.WriteLine "LeftHeader: " & sht.PageSetup.LeftHeader
	fo.WriteLine "CenterHeader: " & sht.PageSetup.CenterHeader
	fo.WriteLine "RightHeader: " & sht.PageSetup.RightHeader
	fo.WriteLine "LeftFooter: " & sht.PageSetup.LeftFooter
	fo.WriteLine "CenterFooter: " & sht.PageSetup.CenterFooter
	fo.WriteLine "RightFooter: " & sht.PageSetup.RightFooter
	On Error GoTo 0
End Function

Function getModuleExtension(cmp)
	Select Case cmp.Type
	Case 2
		getModuleExtension = ".cls"
	Case 3
		getModuleExtension = ".frm"
	Case Else
		getModuleExtension = ".bas"
	End Select
End Function

Sub Sleep(sec)
	if sec = 0 Then Exit Sub
	wsh.Run "ping.exe localhost -n " & sec, 0, True
End Sub

Function saveRangeAsImage(sht, rng, filename)
	Dim obj
	Dim shtNew
	Dim wbkNew
	Dim oldSheetsInNewWorkbook
	Dim i

	saveRangeAsImage = True

	On Error Resume Next
	Err.Clear

	sht.Activate
	With sht.Parent.Windows(1)
		.DisplayGridlines = False
		.View = 1
	End With

	oldSheetsInNewWorkbook = sht.Application.SheetsInNewWorkbook
	sht.Application.SheetsInNewWorkbook = 1
	set wbkNew = sht.Application.Workbooks.Add
	sht.Application.SheetsInNewWorkbook = oldSheetsInNewWorkbook
	Set shtNew = wbkNew.Sheets(1)
	Set obj = wbkNew.Charts.Add
	Set obj = obj.Location(2, shtNew.Name) ' xlLocationAsObject=2

	If sht.Application.Version <= 11 Then
		obj.Parent.Width = rng.Width + 8
		obj.Parent.Height = rng.Height + 8
	Else
		obj.Parent.Width = rng.Width
		obj.Parent.Height = rng.Height
	End If

	For i = 0 to 1
		If sht.Application.Version < 14 Then
			rng.CopyPicture 1, 2 ' xlScreen=1, xlBitmap=2
			If Err.Number = 0 Then
				Sleep i
				obj.Paste
				obj.Export filename, "PNG"
			ElseIf i = 0 Then
				Sleep 1
			End If
		Else
			rng.Copy
			If Err.Number = 0 Then
				Sleep i
				shtNew.Pictures.Paste
				obj.Export filename, "PNG"
			ElseIf i = 0 Then
				Sleep 1
			End If
		End If

		If Err.Number = 0 Then Exit For
		If i = 0 Then Err.Clear
	Next

	wbkNew.Close False

	saveRangeAsImage = (Err.Number = 0)

End Function

Function getTimeStamp()
    Dim dt, tm, ms
    tm = Timer
    ms = Fix((tm - Fix(tm)) * 1000)
    tm = Fix(tm)
    getTimeStamp = (tm \ (60 * 60)) & ":" & ((tm \ 60) Mod 60) & ":" & (tm Mod 60) & "." & ms
End Function

Function findRowByPosition(sht, ByVal rowBegin, ByVal rowEnd, ByVal pos)
    Dim height, rowPrev, row, rowBeginOrg
    row = rowEnd
    rowBeginOrg = rowBegin
    rowPrev = row
    Do
        height = sht.Range("A" & rowBeginOrg & ":A" & row).height
        If height < pos Then
            rowBegin = row
        Else
            rowEnd = row
        End If
        row = (rowEnd - rowBegin) \ 2 + rowBegin
        If row = rowPrev Then
            findRowByPosition = row
            Exit Function
        End If
        rowPrev = row
    Loop
End Function

Function findColumnByPosition(sht, ByVal columnBegin, ByVal columnEnd, ByVal pos)
    Dim width, columnPrev, column, columnBeginOrg
    column = columnEnd
    columnBeginOrg = columnBegin
    columnPrev = column
    Do
        width = sht.Range(sht.Cells(1, columnBeginOrg), sht.Cells(1, column)).width
        If width < pos Then
            columnBegin = column
        Else
            columnEnd = column
        End If
        column = (columnEnd - columnBegin) \ 2 + columnBegin
        If column = columnPrev Then
            findColumnByPosition = column
            Exit Function
        End If
        columnPrev = column
    Loop
End Function

Function saveSheetAsImage(sht, basefilename)
	Dim rngUsed, rngImage, row, rowEnd, column, columnEnd, filename, numX, numY, imageWidth, imageHeight
	imageWidth = regRead(RegKeyPath & "ImageWidth", 1000)
	imageHeight = regRead(RegKeyPath & "ImageHeight", 3000)
	Set rngUsed = getUsedRangeIncludingShapes(sht)
	numX = 1
	column = rngUsed.Column
	Do 
		columnEnd = findColumnByPosition(sht, column, rngUsed.Column + rngUsed.Columns.Count - 1, imageWidth)
		numY = 1
		row = rngUsed.Row
		Do 
			rowEnd = findRowByPosition(sht, row, rngUsed.Row + rngUsed.Rows.Count - 1, imageHeight)
			Set rngImage = sht.Range(sht.Cells(row, column), sht.Cells(rowEnd, columnEnd))
			filename = basefilename & "(" & numX & "-" & numY & ").png"
			If Not saveRangeAsImage(sht, rngImage, filename) Then
				Dim shtNew
				Set shtNew = sht.Parent.Sheets.Add
				shtNew.Range("A1") = getTimeStamp() & ": Error" & Err.Number & ": " & Err.Description
				shtNew.Columns.AutoFit
				saveRangeAsImage shtNew, shtNew.Range("A1"), filename
				shtNew.Delete
			End If
			row = rowEnd + 1
			numY = numY + 1
		Loop While row < rngUsed.row + rngUsed.Rows.Count - 1 
		column = columnEnd + 1
		numX = numX + 1
	Loop While column < rngUsed.column + rngUsed.Columns.Count - 1 
End Function

Function escape(sheetName)
    escape = Replace(sheetName, "%", "%25")
    escape = Replace(escape, "<", "%3C")
    escape = Replace(escape, ">", "%3E")
    escape = Replace(escape, "|", "%7C")
    Select Case Left(UCase(escape), 3)
    Case "CON", "AUX", "NUL"
        If Len(escape) = 3 Then
            escape = "%" & escape
        End If
    Case "COM", "LPT"
        If Len(escape) = 4 And IsNumeric(Mid(escape, 4, 1)) Then
            escape = "%" & escape
        End If
    End Select
End Function

Function get_PluginEvent()
	get_PluginEvent = "FILE_FOLDER_PACK_UNPACK"
End Function

Function get_PluginDescription()
	get_PluginDescription = "Display the text content of MS Excel files"
End Function

Function get_PluginFileFilters()
	get_PluginFileFilters = "\.xls(\..*)?$;\.xlsx(\..*)?$;\.xlsm(\..*)?$;\.xlsb(\..*)?;\.xla(\..*)?$;\.xlax(\..*)?$;\.xltx(\..*)?$;\.xltm(\..*)?$"
End Function

Function get_PluginIsAutomatic()
	get_PluginIsAutomatic = True
End Function

Function get_PluginUnpackedFileExtension()
	get_PluginUnpackedFileExtension = ".tsv"
End Function

Function UnpackFile(fileSrc, fileDst, pbChanged, pSubcode)
	Dim fo
	Dim xl
	Dim wbk
	Dim sht
	Dim cmp

	Set fo = fso.CreateTextFile(fileDst, True, True)

	Set xl = CreateObject("Excel.Application")
	xl.EnableEvents = False
	xl.DisplayAlerts = False

	Set wbk = xl.Workbooks.Open(fileSrc, regRead(RegKeyPath & "UpdateLinks", 0))

	On Error Resume Next

	If regRead(RegKeyPath & "CompareDocumentProperties", False) Then
		fo.WriteLine "[Document Properties]"
		writeObjectProperties fo, wbk.BuiltinDocumentProperties
		fo.WriteLine ""
	End If

	If regRead(RegKeyPath & "CompareNames", True) Then
		fo.WriteLine "[Names]"
		writeObjectProperties fo, wbk.Names
		fo.WriteLine ""
	End If

	For Each sht In wbk.Worksheets
		If regRead(RegKeyPath & "CompareCellValues", True) Then
			fo.WriteLine "[" & sht.Name & "]"
			writeCellValues fo, sht
			fo.WriteLine ""
		End If
		If regRead(RegKeyPath & "CompareFormulas", False) Then
			fo.WriteLine "[" & sht.Name & ".Formulas]"
			writeFormulas fo, sht
			fo.WriteLine ""
		End If
		If regRead(RegKeyPath & "CompareTextsInShapes", True) Then
			fo.WriteLine "[" & sht.Name & ".Shapes]"
			ungroupShapes sht
			writeTextsInShapes fo, sht
			fo.WriteLine ""
		End If
		If regRead(RegKeyPath & "CompareHeadersAndFooters", True) Then
			fo.WriteLine "[" & sht.Name & ".HeadersAndFooters]"
			writeHeadersAndFooters fo, sht
			fo.WriteLine ""
		End If
	Next

	If regRead(RegKeyPath & "CompareVBAMacros", True) Then
		If Not isAccessibleVBAProject(wbk) Then
			fo.WriteLine MsgCannotGetMacros
		End If
		For Each cmp In wbk.VBProject.VBComponents
			fo.WriteLine "[CodeModule." & cmp.Name & "]"
			If cmp.CodeModule.CountOfLines > 0 Then
				fo.WriteLine cmp.CodeModule.Lines(1, cmp.CodeModule.CountOfLines)
			End If
			fo.WriteLine ""
		Next
	End If

	Set sht = Nothing
	wbk.Close
	Set wbk = Nothing
	xl.Quit
	Set xl = Nothing
	fo.Close
	Set fo = Nothing

	pbChanged = True
	pSubcode = 0
	UnpackFile = True

End Function

Function PackFile(fileSrc, fileDst, pbChanged, pSubcode)
	PackFile = False
End Function

Function IsFolder(file)
	IsFolder = regRead(RegKeyPath & "UnpackToFolder", False)
End Function

Function UnpackFolder(fileSrc, folderDst, pbChanged, pSubcode)
	Dim fo
	Dim xl
	Dim wbk
	Dim sht
	Dim cmp
	Dim No

	If Not fso.FolderExists(folderDst) Then fso.CreateFolder folderDst

	Set xl = CreateObject("Excel.Application")
	xl.EnableEvents = False
	xl.DisplayAlerts = False

	Dim backgroundChecking
	backgroundChecking = xl.ErrorCheckingOptions.BackgroundChecking
	xl.ErrorCheckingOptions.BackgroundChecking = False
    
	Set wbk = xl.Workbooks.Open(fileSrc, regRead(RegKeyPath & "UpdateLinks", 0))

	On Error Resume Next

	If regRead(RegKeyPath & "CompareDocumentProperties", False) Then
		Set fo = fso.CreateTextFile(fso.BuildPath(folderDst, "(0)DocumentProperties.txt"), True, True)
		writeObjectProperties fo, wbk.BuiltinDocumentProperties
		fo.Close
	End If

	If regRead(RegKeyPath & "CompareNames", True) Then
		Set fo = fso.CreateTextFile(fso.BuildPath(folderDst, "(0)Names.txt"), True, True)
		writeObjectProperties fo, wbk.Names
		fo.Close
	End If

	No = 1
	For Each sht In wbk.Worksheets
		If regRead(RegKeyPath & "CompareCellValues", True) Then
			Set fo = fso.CreateTextFile(fso.BuildPath(folderDst, "(" & No & ")" & escape(sht.Name) & ".tsv"), True, True)
			writeCellValues fo, sht
			fo.Close
		End If

		If regRead(RegKeyPath & "CompareFormulas", False) Then
			Set fo = fso.CreateTextFile(fso.BuildPath(folderDst, "(" & No & ")" & escape(sht.Name) & "_Formulas.txt"), True, True)
			writeFormulas fo, sht
			fo.Close
		End If

		If regRead(RegKeyPath & "CompareTextsInShapes", True) Then
			Set fo = fso.CreateTextFile(fso.BuildPath(folderDst, "(" & No & ")" & escape(sht.Name) & "_Shapes.txt"), True, True)
			ungroupShapes sht
			writeTextsInShapes fo, sht
			fo.Close
		End If

		If regRead(RegKeyPath & "CompareHeadersAndFooters", True) Then
			Set fo = fso.CreateTextFile(fso.BuildPath(folderDst, "(" & No & ")" & escape(sht.Name) & "_HeadersAndFooters.txt"), True, True)
			writeHeadersAndFooters fo, sht
			fo.Close
		End If

		If regRead(RegKeyPath & "CompareWorksheetsAsImage", True) Then
			saveSheetAsImage sht, fso.BuildPath(folderDst, "(" & No & ")" & escape(sht.Name))
		End If
		No = No + 1
	Next
	If regRead(RegKeyPath & "CompareVBAMacros", True) Then
		If Not isAccessibleVBAProject(wbk) Then
			Set fo = fso.CreateTextFile(fso.BuildPath(folderDst, "CannotGetMacros.bas"), True, True)
			fo.WriteLine MsgCannotGetMacros
			fo.Close
		End If
		
		For Each cmp In wbk.VBProject.VBComponents
			cmp.Export fso.BuildPath(folderDst, cmp.Name & getModuleExtension(cmp))
		Next
	End If

	Set sht = Nothing
	wbk.Close
	Set wbk = Nothing
	xl.ErrorCheckingOptions.BackgroundChecking = backgroundChecking
	xl.Quit
	Set xl = Nothing
	Set fo = Nothing

	pbChanged = True
	pSubcode = 0
	UnpackFolder = True
End Function

Function PackFolder(fileSrc, folderDst, pbChanged, pSubcode)
	PackFolder = False
End Function

Function ShowSettingsDialog()
	Dim tname: tname = fso.BuildPath(fso.GetSpecialFolder(2), fso.GetTempName() & ".hta")
	Dim tfile: Set tfile = fso.CreateTextFile(tname)
	tfile.Write getResource("dialog1")
	tfile.Close
	Run wsh, "mshta.exe """ & tname & """"
	fso.DeleteFile tname 
End Function

Sub Run(sh, cmd)
	sh.Run cmd, 1, True
End Sub

</script>

<resource id="dialog1">
<![CDATA[
<html>
  <head>
    <title>CompareMSExcelFiles.sct WinMerge Plugin Options</title>
    <meta content="text/html" charset="Shift_JIS">
    <style>
      body { background-color: lightgray; }
      ul { list-style:none; }
    </style>
    <script type="text/javascript">
      var REGKEY_PATH = "HKCU\\Software\\Thingamahoochie\\WinMerge\\Plugins\\CompareMSExcelFiles.sct\\";

      function regRead(key, defaultValue) {
        try {
          return (new ActiveXObject("WScript.Shell")).RegRead(key);
        } catch (e) {
          return defaultValue;
        }
      }

      function regWrite(key, value, type) {
        (new ActiveXObject("WScript.Shell")).RegWrite(key, value, type);
      }

      function onload() {

        var w = 800, h = 600;
        window.resizeTo(w, h);
        window.moveTo((screen.width - w) / 2, (screen.height - h) / 2);

        cboLanguage.selectedIndex = navigator.browserLanguage.substr(0, 2) === 'ja' ? 1 : 0;
        setLanguage(navigator.browserLanguage);
        chkUnpackToFolder.checked = regRead(REGKEY_PATH + "UnpackToFolder", false);
        chkUpdateLinks.checked = (regRead(REGKEY_PATH + "UpdateLinks", 0) == 3);
        chkCompareDocumentProperties.checked = regRead(REGKEY_PATH + "CompareDocumentProperties", false);
        chkCompareNames.checked = regRead(REGKEY_PATH + "CompareNames", true);
        chkCompareCellValues.checked = regRead(REGKEY_PATH + "CompareCellValues", true);
        chkCompareWorksheetsAsImage.checked = regRead(REGKEY_PATH + "CompareWorksheetsAsImage", true);
        txtImageWidth.value  = regRead(REGKEY_PATH + "ImageWidth",  1000);
        txtImageHeight.value = regRead(REGKEY_PATH + "ImageHeight", 3000);
        chkCompareFormulas.checked = regRead(REGKEY_PATH + "CompareFormulas", false);
        chkCompareTextsInShapes.checked = regRead(REGKEY_PATH + "CompareTextsInShapes", true);
        chkCompareHeadersAndFooters.checked = regRead(REGKEY_PATH + "CompareHeadersAndFooters", true);
        chkCompareVBAMacros.checked = regRead(REGKEY_PATH + "CompareVBAMacros", true);
        chkUnpackToFolder_onclick();
        chkCompareWorksheetsAsImage_onclick();
      }

      function setLanguage(lang) {
        var div = document.getElementById("language") || document.createElement('div')
        div.id = "language";
        var html = '&shy;<style>';
        if (lang.substr(0, 2).toLowerCase() === 'ja') {
          html += '.en { display: none } .ja { display: inline }';
        } else {
          html += '.ja { display: none } .en { display: inline }';
        }
        div.innerHTML = html;
        if (!document.getElementById("language"))
          document.body.appendChild(div);
      }

      function cboLanguage_onclick() {
        setLanguage(cboLanguage.options[cboLanguage.selectedIndex].text);
      }

      function chkUnpackToFolder_onclick() {
        if (!chkUnpackToFolder.checked)
          chkCompareWorksheetsAsImage.checked = false;
      }

      function chkCompareWorksheetsAsImage_onclick() {
        if (chkCompareWorksheetsAsImage.checked)
          chkUnpackToFolder.checked = true;
      }

      function btnOk_onclick() {
        regWrite(REGKEY_PATH + "UnpackToFolder", chkUnpackToFolder.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "UpdateLinks", chkUpdateLinks.checked ? 3 : 0, "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareDocumentProperties", chkCompareDocumentProperties.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareNames", chkCompareNames.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareCellValues", chkCompareCellValues.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareWorksheetsAsImage", chkCompareWorksheetsAsImage.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "ImageWidth",  Number(txtImageWidth.value),  "REG_DWORD");
        regWrite(REGKEY_PATH + "ImageHeight", Number(txtImageHeight.value), "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareFormulas", chkCompareFormulas.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareTextsInShapes", chkCompareTextsInShapes.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareHeadersAndFooters", chkCompareHeadersAndFooters.checked, "REG_DWORD");
        regWrite(REGKEY_PATH + "CompareVBAMacros", chkCompareVBAMacros.checked, "REG_DWORD"); window.close();
      }

      function btnCancel_onclick() {
        window.close();
      }
      
      function onlyNumeric() {
        var k = event.keyCode;
        if ( k ==  9 || k == 13 || k == 37 || k == 39 || k == 46 || k ==  8 || ( k >= 48 && k <= 57 ) || ( k >= 96 && k <= 105 )) return true;
        event.returnValue = false;
        return false;
      }
      
    </script>
  </head>
  <body onload="onload();">
    <div>
      <ul>
        <li>
          <label class="en">Language: </label>
          <label class="ja">言語: </label>
          <select id="cboLanguage" onclick="cboLanguage_onclick();" >
            <option value="English">English</option>
            <option value="Japanese">Japanese</option>
          </select>
        </li>
      </ul>
      <ul>
        <li>
          <input id="chkUnpackToFolder" type="checkbox" onclick="chkUnpackToFolder_onclick();"/>
          <label class="en">Extract workbook data to multiple files</label>
          <label class="ja">ワークブックの情報を複数ファイルに展開する</label>
        </li>
        <li>
          <input id="chkUpdateLinks" type="checkbox" />
          <label class="en">Update external references(links)</label>
          <label class="ja">比較時、外部参照(リンク)を更新する</label>
        </li>
        <li>
          <input id="chkCompareDocumentProperties" type="checkbox" />
          <label class="en">Compare document properties</label>
          <label class="ja">ドキュメントプロパティを比較する</label>
        </li>
        <li>
          <input id="chkCompareNames" type="checkbox" />
          <label class="en">Compare names</label>
          <label class="ja">名前の定義を比較する</label>
        </li>
        <li>
          <input id="chkCompareCellValues" type="checkbox" />
          <label class="en">Compare cell values</label>
          <label class="ja">各セルの値を比較する</label>
        </li>
        <li>
          <input id="chkCompareWorksheetsAsImage" type="checkbox" onclick="chkCompareWorksheetsAsImage_onclick();"/>
          <label class="en">Compare worksheets as image (very slow)</label>
          <label class="ja">ワークシートを画像化して比較する (処理時間増大)</label>
          <span class="en"> - Image split size: </span>
          <span class="ja"> - 画像分割サイズ: </span>
          <input id="txtImageWidth"  type="text" size="5" maxlength="4" onkeyDown="return onlyNumeric();"/>
          <span> x </span>
          <input id="txtImageHeight" type="text" size="5" maxlength="4" onkeyDown="return onlyNumeric();"/>
        </li>
        <li>
          <input id="chkCompareFormulas" type="checkbox" />
          <label class="en">Compare formulas</label>
          <label class="ja">数式を比較する</label>
        </li>
        <li>
          <input id="chkCompareTextsInShapes" type="checkbox" />
          <label class="en">Compare texts in shapes</label>
          <label class="ja">図形内のテキストを比較する</label>
        </li>
        <li>
          <input id="chkCompareHeadersAndFooters" type="checkbox" />
          <label class="en">Compare headers and footers</label>
          <label class="ja">ヘッダーとフッターを比較する</label>
        </li>
        <li>
          <input id="chkCompareVBAMacros" type="checkbox" />
          <label class="en">Compare VBA macros</label>
          <label class="ja">VBA マクロを比較する</label>
        </li>
      </ul>
      <ul>
        <li>
          <input class="en" type="button" onclick="btnOk_onclick();" value="OK" />
          <input class="en" type="button" onclick="btnCancel_onclick();" value="Cancel" />
          <input class="ja" type="button" onclick="btnOk_onclick();" value="OK" />
          <input class="ja" type="button" onclick="btnCancel_onclick();" value="キャンセル" />
        </li>
      </ul>
    </div>
  </body>
</html>
]]>
</resource>

</scriptlet>
